home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / game / think / UChesSrc.lha / dspcom.c < prev    next >
C/C++ Source or Header  |  1993-06-03  |  39KB  |  1,720 lines

  1. /*
  2.  * dspcom.c - C source for GNU CHESS
  3.  *
  4.  * Copyright (c) 1988,1989,1990 John Stanback
  5.  * Copyright (c) 1992 Free Software Foundation
  6.  *
  7.  * This file is part of GNU CHESS.
  8.  *
  9.  * GNU Chess is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2, or (at your option)
  12.  * any later version.
  13.  *
  14.  * GNU Chess is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with GNU Chess; see the file COPYING.  If not, write to
  21.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  22.  */
  23. #include "gnuchess.h"
  24. extern INTSIZE Mwpawn[64], Mbpawn[64], Mknight[2][64], Mbishop[2][64];
  25. extern char *version, *patchlevel;
  26. char mvstr[4][6];
  27. char *InPtr;
  28.  
  29. extern unsigned int TTadd;
  30.  
  31. extern int IllegalMove;
  32. int func_num=0;
  33. int thinkahead=0;
  34. int ThinkInARow=0;
  35. int ThinkAheadWorked=0;
  36. int ThinkAheadDepth=0;
  37.  
  38. extern short int ISZERO;
  39. int MouseDropped=0;
  40.  
  41. #include <ctype.h>
  42. #include <signal.h>
  43.  
  44. #ifdef AMIGA
  45. #define __USE_SYSBASE
  46. #include <exec/types.h>
  47. #include <exec/exec.h>
  48. #include <proto/exec.h>
  49. #include <proto/dos.h>
  50. #include <proto/graphics.h>
  51. #include <proto/intuition.h>
  52. struct IntuiMessage __aligned globalmessage;
  53. int globalmessage_valid=0;
  54. extern struct Window __aligned *wG;
  55. extern int procpri;
  56. extern struct Process *myproc;
  57. extern struct MenuItem MenuItem6;
  58. extern struct Menu Menu1;
  59. extern unsigned char cookedchar[128];
  60. #endif
  61.  
  62. #define SIGQUIT SIGINT
  63.  
  64. #ifdef MSDOS
  65. #include <dos.h>
  66. #include <conio.h>
  67. #include <stdlib.h>
  68. #include <string.h>
  69. #include <time.h>
  70. #else
  71. #include <dos.h>
  72. #include <stdlib.h>
  73. #include <string.h>
  74. #include <time.h>
  75. /*
  76. #include <sys/param.h>
  77. #include <sys/types.h>
  78. #include <sys/file.h>
  79. #include <sys/ioctl.h>
  80. */
  81. #endif
  82.  
  83.  
  84. /*
  85.  * ataks.h - Header source for GNU CHESS
  86.  *
  87.  * Copyright (c) 1988,1989,1990 John Stanback
  88.  * Copyright (c) 1992 Free Software Foundation
  89.  *
  90.  * This file is part of GNU CHESS.
  91.  *
  92.  * GNU Chess is free software; you can redistribute it and/or modify
  93.  * it under the terms of the GNU General Public License as published by
  94.  * the Free Software Foundation; either version 2, or (at your option)
  95.  * any later version.
  96.  *
  97.  * GNU Chess is distributed in the hope that it will be useful,
  98.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  99.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  100.  * GNU General Public License for more details.
  101.  *
  102.  * You should have received a copy of the GNU General Public License
  103.  * along with GNU Chess; see the file COPYING.  If not, write to
  104.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  105.  */
  106. inline int
  107. SqAtakd2 (ARGSZ int sq, ARGSZ int side)
  108.  
  109. /*
  110.  * See if any piece with color 'side' ataks sq.  First check pawns then
  111.  * Queen, Bishop, Rook and King and last Knight.
  112.  */
  113.  
  114. {
  115.   register INTSIZE u;
  116.   register unsigned char *ppos, *pdir;
  117.   INTSIZE xside;
  118.  
  119.   xside = side ^ 1;
  120.   pdir = nextdir[ptype[xside][pawn]][sq];
  121.   u = pdir[sq];            /* follow captures thread */
  122.   if (u != sq)
  123.     {
  124.       if (board[u] == pawn && color[u] == side)
  125.     return (true);
  126.       u = pdir[u];
  127.       if (u != sq && board[u] == pawn && color[u] == side)
  128.     return (true);
  129.     }
  130.   /* king capture */
  131.   if (distance (sq, PieceList[side][0]) == 1)
  132.     return (true);
  133.   /* try a queen bishop capture */
  134.   ppos = nextpos[bishop][sq];
  135.   pdir = nextdir[bishop][sq];
  136.   u = ppos[sq];
  137.   do
  138.     {
  139.       if (color[u] == neutral)
  140.     u = ppos[u];
  141.       else
  142.     {
  143.       if (color[u] == side && (board[u] == queen || board[u] == bishop))
  144.         return (true);
  145.       u = pdir[u];
  146.     }
  147.   } while (u != sq);
  148.   /* try a queen rook capture */
  149.   ppos = nextpos[rook][sq];
  150.   pdir = nextdir[rook][sq];
  151.   u = ppos[sq];
  152.   do
  153.     {
  154.       if (color[u] == neutral)
  155.     u = ppos[u];
  156.       else
  157.     {
  158.       if (color[u] == side && (board[u] == queen || board[u] == rook))
  159.         return (true);
  160.       u = pdir[u];
  161.     }
  162.   } while (u != sq);
  163.   /* try a knight capture */
  164.   pdir = nextdir[knight][sq];
  165.   u = pdir[sq];
  166.   do
  167.     {
  168.       if (color[u] == side && board[u] == knight)
  169.     return (true);
  170.       u = pdir[u];
  171.   } while (u != sq);
  172.   return (false);
  173. }
  174.  
  175.  
  176. void
  177. algbr (INTSIZE int f, INTSIZE int t, INTSIZE int flag)
  178.  
  179.  
  180. /*
  181.  * Generate move strings in different formats.
  182.  */
  183.  
  184. {
  185.   int m3p;
  186.  
  187.   if (f != t)
  188.     {
  189.       /* algebraic notation */
  190.       mvstr[0][0] = cxx[column (f)];
  191.       mvstr[0][1] = rxx[row (f)];
  192.       mvstr[0][2] = cxx[column (t)];
  193.       mvstr[0][3] = rxx[row (t)];
  194.       mvstr[0][4] = mvstr[3][0] = '\0';
  195.       if (((mvstr[1][0] = pxx[board[f]]) == 'P') || (flag & promote))
  196.     {
  197.       if (mvstr[0][0] == mvstr[0][2])    /* pawn did not eat */
  198.         {
  199.           mvstr[2][0] = mvstr[1][0] = mvstr[0][2];    /* to column */
  200.           mvstr[2][1] = mvstr[1][1] = mvstr[0][3];    /* to row */
  201.           m3p = 2;
  202.         }
  203.       else
  204.         /* pawn ate */
  205.         {
  206.           mvstr[2][0] = mvstr[1][0] = mvstr[0][0];    /* column */
  207.           mvstr[2][1] = mvstr[1][1] = mvstr[0][2];    /* to column */
  208.           mvstr[2][2] = mvstr[0][3];
  209.           m3p = 3;        /* to row */
  210.         }
  211.       if (flag & promote)
  212.         {
  213.           mvstr[0][4] = mvstr[1][2] = mvstr[2][m3p] = qxx[flag & pmask];
  214.           mvstr[0][5] = mvstr[1][3] = mvstr[2][m3p + 1] = mvstr[3][0] = '\0';
  215. #ifdef CHESSTOOL
  216.           mvstr[3][0] = mvstr[0][0];    /* Allow e7e8 for chesstool */
  217.           mvstr[3][1] = mvstr[0][1];
  218.           mvstr[3][2] = mvstr[0][2];
  219.           mvstr[3][3] = mvstr[0][3];
  220.           mvstr[3][4] = '\0';
  221. #endif
  222.         }
  223.       mvstr[2][m3p] = mvstr[1][2] = '\0';
  224.     }
  225.       else
  226.     /* not a pawn */
  227.     {
  228.       mvstr[2][0] = mvstr[1][0];
  229.       mvstr[2][1] = mvstr[0][1];
  230.       mvstr[2][2] = mvstr[1][1] = mvstr[0][2];    /* to column */
  231.       mvstr[2][3] = mvstr[1][2] = mvstr[0][3];    /* to row */
  232.       mvstr[2][4] = mvstr[1][3] = '\0';
  233.       strcpy (mvstr[3], mvstr[2]);
  234.       mvstr[3][1] = mvstr[0][0];
  235.       if (flag & cstlmask)
  236.         {
  237.           if (t > f)
  238.         {
  239.           strcpy (mvstr[1], CP[5]);
  240.           strcpy (mvstr[2], CP[7]);
  241.         }
  242.           else
  243.         {
  244.           strcpy (mvstr[1], CP[6]);
  245.           strcpy (mvstr[2], CP[8]);
  246.         }
  247.         }
  248.     }
  249.     }
  250.   else
  251.     mvstr[0][0] = mvstr[1][0] = mvstr[2][0] = mvstr[3][0] = '\0';
  252. }
  253.  
  254.  
  255. int
  256. VerifyMove (char *s, INTSIZE int iop, INTSIZE unsigned int *mv)
  257.  
  258. /*
  259.  * Compare the string 's' to the list of legal moves available for the
  260.  * opponent. If a match is found, make the move on the board.
  261.  */
  262.  
  263. {
  264.   static INTSIZE pnt, tempb, tempc, tempsf, tempst, cnt;
  265.   int r,c,l;
  266.   char mystr[80];
  267.   char piece;
  268.   static struct leaf xnode;
  269.   struct leaf *node;
  270.  
  271.   if ((s[1] >= 'a') && (s[1] <= 'h'))
  272.    {
  273.     if ((s[0] == 'n') || (s[0] == 'p') || (s[0] == 'b') ||
  274.         (s[0] == 'k') || (s[0] == 'r') || (s[0] == 'q'))
  275.      {
  276.       s[0] = toupper(s[0]);
  277.      }
  278.    }
  279.   *mv = 0;
  280.   if (iop == 2)
  281.     {
  282.       UnmakeMove (opponent, &xnode, &tempb, &tempc, &tempsf, &tempst);
  283.       return (false);
  284.     }
  285.   cnt = 0;
  286.   MoveList (opponent, 2);
  287.   pnt = TrPnt[2];
  288.   while (pnt < TrPnt[3])
  289.     {
  290.       node = &Tree[pnt++];
  291.       algbr (node->f, node->t, (INTSIZE) node->flags);
  292.       if (strcmp (s, mvstr[0]) == 0 || strcmp (s, mvstr[1]) == 0 ||
  293.       strcmp (s, mvstr[2]) == 0 || strcmp (s, mvstr[3]) == 0)
  294.     {
  295.       cnt++;
  296.       xnode = *node;
  297.     }
  298.     }
  299.   if (cnt == 1)
  300.     {
  301.       MakeMove (opponent, &xnode, &tempb, &tempc, &tempsf, &tempst, &INCscore);
  302.       if (SqAtakd2 (PieceList[opponent][0], computer))
  303.     {
  304.       UnmakeMove (opponent, &xnode, &tempb, &tempc, &tempsf, &tempst);
  305. #if defined CHESSTOOL
  306.       printz (CP[15]);
  307. #else
  308. #ifdef NONDSP
  309. /* Illegal move in check */
  310. #ifndef AMIGA
  311.       printz (CP[77]);
  312.       printz ("\n");
  313. #else
  314.           DisplayComputerMove(CP[77]);
  315. #endif
  316. #else
  317. /* Illegal move in check */
  318.       ShowMessage (CP[77]);
  319. #endif
  320. #endif /* CHESSTOOL */
  321.       return (false);
  322.     }
  323.       else
  324.     {
  325.       if (iop == 1)
  326.         return (true);
  327.       UpdateDisplay (xnode.f, xnode.t, 0, (INTSIZE) xnode.flags);
  328.       if ((board[xnode.t] == pawn)
  329.           || (xnode.flags & capture)
  330.           || (xnode.flags & cstlmask))
  331.         {
  332.           Game50 = GameCnt;
  333.           ZeroRPT ();
  334.         }
  335.       GameList[GameCnt].depth = GameList[GameCnt].score = 0;
  336.       GameList[GameCnt].nodes = 0;
  337.       ElapsedTime (1);
  338.       GameList[GameCnt].time = (INTSIZE) et;
  339.       if (TCflag)
  340.         {
  341.           TimeControl.clock[opponent] -= et;
  342.           timeopp[oppptr] = et;
  343.           --TimeControl.moves[opponent];
  344.         }
  345.       *mv = (xnode.f << 8) | xnode.t;
  346.       algbr (xnode.f, xnode.t, false);
  347. #ifdef AMIGA
  348.       strcpy(mystr,mvstr[0]);
  349.       r = mystr[3] - '1';
  350.       c = mystr[2] - 'a';
  351.       l = ((flag.reverse) ? locn (7 - r, 7 - c) : locn (r, c));
  352.       if (color[l] == neutral)
  353.        {
  354.     DisplayBeep(0L);
  355.         Delay(25L);
  356.     DisplayBeep(0L);
  357.         Delay(25L);
  358.     DisplayBeep(0L);
  359.         Delay(25L);
  360.         piece = ' ';
  361.        }
  362.       else if (color[l] == white)
  363.         piece = qxx[board[l]]; /* white are lower case pieces */
  364.       else
  365.         piece = pxx[board[l]]; /* black are upper case pieces */
  366.       AnimateAmigaMove(mystr,piece);
  367. #endif
  368.       return (true);
  369.     }
  370.     }
  371. #if defined CHESSTOOL
  372.   printz (CP[78]);
  373. #else
  374. #ifdef NONDSP
  375. /* Illegal move */
  376. #ifdef AMIGA
  377.   sprintf(mystr,CP[75],s);
  378.   DisplayComputerMove(mystr);
  379. #else
  380.   printz (CP[75], s);
  381. #endif
  382. #ifdef DEBUG8
  383.   if (1)
  384.     {
  385.       FILE *D;
  386.       int r, c, l;
  387.       extern unsigned INTSIZE int PrVar[];
  388.       D = fopen ("/tmp/DEBUG", "a+");
  389.       pnt = TrPnt[2];
  390.       fprintf (D, "resp = %d\n", ResponseTime);
  391.       fprintf (D, "iop = %d\n", iop);
  392.       fprintf (D, "matches = %d\n", cnt);
  393.       algbr (hint >> 8, hint & 0xff, (INTSIZE) 0);
  394.       fprintf (D, "hint %s\n", mvstr[0]);
  395.       fprintf (D, "inout move is %s\n", s);
  396.       for (r = 1; PrVar[r]; r++)
  397.     {
  398.       algbr (PrVar[r] >> 8, PrVar[r] & 0xff, (INTSIZE) 0);
  399.       fprintf (D, " %s", mvstr[0]);
  400.     }
  401.       fprintf (D, "\n");
  402.       fprintf (D, "legal move are \n");
  403.       while (pnt < TrPnt[3])
  404.     {
  405.       node = &Tree[pnt++];
  406.       algbr (node->f, node->t, (INTSIZE) node->flags);
  407.       fprintf (D, "%s %s %s %s\n", mvstr[0], mvstr[1], mvstr[2], mvstr[3]);
  408.     }
  409.       fprintf (D, "\n current board is\n");
  410.       for (r = 7; r >= 0; r--)
  411.     {
  412.       for (c = 0; c <= 7; c++)
  413.         {
  414.           l = locn (r, c);
  415.           if (color[l] == neutral)
  416.         fprintf (D, " -");
  417.           else if (color[l] == white)
  418.         fprintf (D, " %c", qxx[board[l]]);
  419.           else
  420.         fprintf (D, " %c", pxx[board[l]]);
  421.         }
  422.       fprintf (D, "\n");
  423.     }
  424.       fprintf (D, "\n");
  425.       fclose (D);
  426.       abort ();
  427.     }
  428. #endif
  429. #else
  430. /* Illegal move */
  431.   ShowMessage (CP[76]);
  432. #endif
  433. #endif /* CHESSTOOL */
  434. #if !defined CHESSTOOL && !defined XBOARD
  435.   if (cnt > 1)
  436.     ShowMessage (CP[32]);
  437. #endif /* CHESSTOOL */
  438.   return (false);
  439. }
  440.  
  441. int
  442. parser (char *f, int side)
  443. {
  444.   int c1, r1, c2, r2;
  445.  
  446.   if (f[4] == 'o')
  447.     if (side == black)
  448.       return 0x3C3A;
  449.     else
  450.       return 0x0402;
  451.   else if (f[0] == 'o')
  452.     if (side == black)
  453.       return 0x3C3E;
  454.     else
  455.       return 0x0406;
  456.   else
  457.     {
  458.       c1 = f[0] - 'a';
  459.       r1 = f[1] - '1';
  460.       c2 = f[2] - 'a';
  461.       r2 = f[3] - '1';
  462.       return (locn (r1, c1) << 8) | locn (r2, c2);
  463.     }
  464.   /*NOTREACHED*/
  465. }
  466.  
  467. int myfgets(char *buff,int len,BPTR fd)
  468. {
  469.  char tmpch;
  470.  int done=0;
  471.  int numchars=0;
  472.  int retval;
  473.  
  474.  retval = 1;
  475.  do{
  476.     if (Read(fd,&tmpch,1L) != 1L)
  477.      {
  478.       done = 1;
  479.       retval = 0;
  480.      }
  481.     else
  482.      {
  483.       buff[numchars++] = tmpch;
  484.       if (tmpch == '\n')
  485.        {
  486.         done = 1;
  487.        }
  488.       if (numchars >= (len-1))
  489.        {
  490.         done = 1;
  491.         retval = 0;
  492.        }
  493.      }
  494.   } while (!done);
  495.  buff[numchars] = '\0';
  496.  Delay(5L);
  497.  return(retval);
  498. }
  499.  
  500. void
  501. GetGame (void)
  502. {
  503.   char checkstr[8];
  504.   BPTR fd;
  505.   char fname[256], *p;
  506.   int c, i, j;
  507.   INTSIZE sq;
  508.  
  509. /* enter file name */
  510.  if (!GetFileName(fname))
  511.   {
  512.    return;
  513.   }
  514.  (void)SetTaskPri((struct Task *)myproc,0);
  515.  if (fname[0] == 0)
  516.   ShowMessage (CP[63]);
  517. #ifndef AMIGA
  518.   scanz ("%s", fname);
  519. #endif
  520. /* chess.000 */
  521.   if (fname[0] == '\0')
  522.     strcpy (fname, CP[137]);
  523.   ShowMessage("Loading Game..");
  524.   Delay(20L);
  525.   if ((fd = Open (fname, MODE_OLDFILE)) != NULL)
  526.     {
  527.       Delay(20L);
  528.       NewGame ();
  529.       ShowMessage("Loading Game..");
  530.       Delay(10L);
  531.       myfgets (fname, 256, fd);
  532.       for(i=0;i<5;i++)
  533.        checkstr[i] = fname[i];
  534.       checkstr[5] = 0;
  535.       if (stricmp(checkstr,"Black"))
  536.        {
  537.         DisplayBeep(0L);
  538.         Delay(25L);
  539.         DisplayBeep(0L);
  540.         Close(fd);
  541.         return;
  542.        }
  543.       computer = opponent = white;
  544.       InPtr = fname;
  545.       skip ();
  546.       if (*InPtr == 'c')
  547.     computer = black;
  548.       else
  549.     opponent = black;
  550.       skip ();
  551.       skip ();
  552.       skip ();
  553.       Game50 = atoi (InPtr);
  554.       myfgets (fname, 256, fd);
  555.       InPtr = &fname[14];
  556.       castld[white] = ((*InPtr == CP[214][0]) ? true : false);
  557.       skip ();
  558.       skip ();
  559.       castld[black] = ((*InPtr == CP[214][0]) ? true : false);
  560.       myfgets (fname, 256, fd);
  561.       InPtr = &fname[11];
  562.       skipb ();
  563.       TCflag = atoi (InPtr);
  564.       skip ();
  565.       InPtr += 14;
  566.       skipb ();
  567.       OperatorTime = atoi (InPtr);
  568.       myfgets (fname, 256, fd);
  569.       InPtr = &fname[11];
  570.       skipb ();
  571.       TimeControl.clock[white] = atoi (InPtr);
  572.       skip ();
  573.       skip ();
  574.       TimeControl.moves[white] = atoi (InPtr);
  575.       myfgets (fname, 256, fd);
  576.       InPtr = &fname[11];
  577.       skipb ();
  578.       TimeControl.clock[black] = atoi (InPtr);
  579.       skip ();
  580.       skip ();
  581.       TimeControl.moves[black] = atoi (InPtr);
  582.       myfgets (fname, 256, fd);
  583.       for (i = 7; i > -1; i--)
  584.     {
  585.       myfgets (fname, 256, fd);
  586.       p = &fname[2];
  587.       InPtr = &fname[11];
  588.       skipb ();
  589.       for (j = 0; j < 8; j++)
  590.         {
  591.           sq = i * 8 + j;
  592.           if (*p == '.')
  593.         {
  594.           board[sq] = no_piece;
  595.           color[sq] = neutral;
  596.         }
  597.           else
  598.         {
  599.           for (c = 0; c < 8; c++)
  600.             {
  601.               if (*p == pxx[c])
  602.             {
  603.               board[sq] = c;
  604.               color[sq] = black;
  605.             }
  606.             }
  607.           for (c = 0; c < 8; c++)
  608.             {
  609.               if (*p == qxx[c])
  610.             {
  611.               board[sq] = c;
  612.               color[sq] = white;
  613.             }
  614.             }
  615.         }
  616.           p++;
  617.           Mvboard[sq] = atoi (InPtr);
  618.           skip ();
  619.         }
  620.     }
  621.       GameCnt = 0;
  622.       flag.regularstart = true;
  623.       /*Book = BOOKFAIL;*/
  624.       myfgets (fname, 256, fd);
  625.       myfgets (fname, 256, fd);
  626.       myfgets (fname, 256, fd);
  627.       while (myfgets (fname, 256, fd))
  628.     {
  629.       struct GameRec *g;
  630.       int side = computer;
  631.  
  632. /*printf("in while loop\n");*/
  633.       side = side ^ 1;
  634.       ++GameCnt;
  635.       InPtr = fname;
  636.       skipb ();
  637.       g = &GameList[GameCnt];
  638.       g->gmove = parser (InPtr, side);
  639.       skip ();
  640.       g->score = atoi (InPtr);
  641.       skip ();
  642.       g->depth = atoi (InPtr);
  643.       skip ();
  644.       g->nodes = atoi (InPtr);
  645.       skip ();
  646.       g->time = atoi (InPtr);
  647.       skip ();
  648.       g->flags = c = atoi (InPtr);
  649.       skip ();
  650.       g->hashkey = strtol (InPtr, (char **) NULL, 16);
  651.       skip ();
  652.       g->hashbd = strtol (InPtr, (char **) NULL, 16);
  653.       g->piece = no_piece;
  654.       g->color = neutral;
  655.       if (c & (capture | cstlmask))
  656.         {
  657.           if (c & capture)
  658.         {
  659.           skip ();
  660.           for (c = 0; c < 8; c++)
  661.             if (pxx[c] == *InPtr)
  662.               break;
  663.           g->piece = c;
  664.         }
  665.           skip ();
  666.           g->color = ((*InPtr == CP[119][0]) ? black : white);
  667.         }
  668.     }
  669.       /* GameCnt--; */
  670.       if (TimeControl.clock[white] > 0)
  671.     TCflag = true;
  672.       Close (fd);
  673.     }
  674.   ISZERO = 1;
  675.   ZeroRPT ();
  676.   InitializeStats ();
  677.   UpdateDisplay (0, 0, 1, 0);
  678.   Sdepth = 0;
  679.   hint = 0;
  680.   DisableMoveNow();
  681.   if (!TCflag)
  682.    {
  683.     EnableMoveNow();
  684.    }
  685.   else
  686.    {
  687.     i = player;
  688.     player = black;
  689.     UpdateClocks();
  690.     player = white;
  691.     UpdateClocks();
  692.     player = i;
  693.     if ((((TimeControl.clock[black])/TimeControl.moves[black]) > 5900) ||
  694.         (((TimeControl.clock[white])/TimeControl.moves[white]) > 5900))
  695.      {
  696.       EnableMoveNow();
  697.      }
  698.    }
  699.   ShowMessage("Game Loaded");
  700. #ifdef AMIGA
  701.   DrawAmigaBoard();
  702. #endif
  703.   (void)SetTaskPri((struct Task *)myproc,procpri);
  704. }
  705.  
  706. void
  707. GetXGame (void)
  708. {
  709.   FILE *fd;
  710.   char fname[256], *p;
  711.   int c, i, j;
  712.   INTSIZE sq;
  713. /* Enter file name */
  714.   ShowMessage (CP[63]);
  715. #ifndef AMIGA
  716.   scanz ("%s", fname);
  717. #endif
  718.   if (fname[0] == '\0')
  719. /* xboard.position.read*/
  720.     strcpy (fname, CP[205]);
  721.   if ((fd = fopen (fname, "r")) != NULL)
  722.     {
  723.       NewGame ();
  724.       flag.regularstart = false;
  725.       Book = false;
  726.       fgets (fname, 256, fd);
  727.       fname[6] = '\0';
  728.       if (strcmp (fname, CP[206]))
  729.     return;
  730.       fgets (fname, 256, fd);
  731.       fgets (fname, 256, fd);
  732.       for (i = 7; i > -1; i--)
  733.     {
  734.       fgets (fname, 256, fd);
  735.       p = fname;
  736.       for (j = 0; j < 8; j++)
  737.         {
  738.           sq = i * 8 + j;
  739.           if (*p == '.')
  740.         {
  741.           board[sq] = no_piece;
  742.           color[sq] = neutral;
  743.         }
  744.           else
  745.         {
  746.           for (c = 0; c < 8; c++)
  747.             {
  748.               if (*p == qxx[c])
  749.             {
  750.               board[sq] = c;
  751.               color[sq] = black;
  752.             }
  753.             }
  754.           for (c = 0; c < 8; c++)
  755.             {
  756.               if (*p == pxx[c])
  757.             {
  758.               board[sq] = c;
  759.               color[sq] = white;
  760.             }
  761.             }
  762.         }
  763.           p += 2;
  764.         }
  765.     }
  766.       fclose (fd);
  767.     }
  768.   ISZERO = 1;
  769.   ZeroRPT ();
  770.   InitializeStats ();
  771.   UpdateDisplay (0, 0, 1, 0);
  772.   Sdepth = 0;
  773.   hint = 0;
  774. }
  775.  
  776. void
  777. SaveGame (void)
  778. {
  779.   FILE *fd;
  780.   char fname[256];
  781.   INTSIZE sq, i, c, f, t;
  782.   char p;
  783.  
  784.   if (!(GetFileName(savefile)))   
  785.    { 
  786.     return;
  787.    }
  788.   (void)SetTaskPri((struct Task *)myproc,0);
  789.   if (savefile[0])
  790.     strcpy (fname, savefile);
  791.   else
  792.     {
  793. /* Enter file name*/
  794.       ShowMessage (CP[63]);
  795. #ifndef AMIGA
  796.       scanz ("%s", fname);
  797. #endif
  798.     }
  799.  
  800.   if (fname[0] == '\0')
  801. /* chess.000 */
  802.     strcpy (fname, CP[137]);
  803.   Delay(25L);
  804.   if ((fd = fopen (fname, "w")) != NULL)
  805.     {
  806.       char *b, *w;
  807.  
  808.       Delay(25L);
  809.       b = w = CP[74];
  810.       if (computer == black)
  811.     b = CP[141];
  812.       if (computer == white)
  813.     w = CP[141];
  814.       fprintf (fd, CP[37], b, w, Game50);
  815.       fprintf (fd, CP[42], castld[white] ? CP[214] : CP[215], castld[black] ? CP[214] : CP[215]);
  816.       fprintf (fd, CP[111], TCflag, OperatorTime);
  817.       fprintf (fd, CP[117],
  818.            TimeControl.clock[white], TimeControl.moves[white],
  819.            TimeControl.clock[black], TimeControl.moves[black]);
  820.       for (i = 7; i > -1; i--)
  821.     {
  822.       fprintf (fd, "%1d ", i + 1);
  823.       for (c = 0; c < 8; c++)
  824.         {
  825.           sq = i * 8 + c;
  826.           switch (color[sq])
  827.         {
  828.         case black:
  829.           p = pxx[board[sq]];
  830.           break;
  831.         case white:
  832.           p = qxx[board[sq]];
  833.           break;
  834.         default:
  835.           p = '.';
  836.         }
  837.           fprintf (fd, "%c", p);
  838.         }
  839.       for (f = i * 8; f < i * 8 + 8; f++)
  840.         fprintf (fd, " %d", Mvboard[f]);
  841.       fprintf (fd, "\n");
  842.     }
  843.       fprintf (fd, "  %s\n", cxx);
  844.       fprintf (fd, CP[126]);
  845.       for (i = 1; i <= GameCnt; i++)
  846.     {
  847.       struct GameRec *g = &GameList[i];
  848.  
  849.       f = g->gmove >> 8;
  850.       t = (g->gmove & 0xFF);
  851.       algbr (f, t, g->flags);
  852.       fprintf (fd, "%s %5d %5d %7ld %5d %5d  %#08lx %#08lx  %c   %s\n",
  853.            mvstr[0], g->score, g->depth,
  854.            g->nodes, g->time, g->flags, g->hashkey, g->hashbd,
  855.        pxx[g->piece], ((g->color == 2) ? "     " : ColorStr[g->color]));
  856.     }
  857.       fclose (fd);
  858. /* Game saved */
  859.       ShowMessage (CP[70]);
  860.     }
  861.   else
  862.     /*ShowMessage ("Could not open file");*/
  863.     ShowMessage (CP[48]);
  864.   (void)SetTaskPri((struct Task *)myproc,procpri);
  865. }
  866.  
  867. void
  868. ListGame (getstr)
  869. int getstr;
  870. {
  871.   FILE *fd;
  872.   INTSIZE i, f, t;
  873.   long when;
  874.   char fname[256], dbuf[256];
  875.  
  876.   if (listfile[0])
  877.     strcpy (fname, listfile);
  878.   else
  879.     {
  880. #ifdef MSDOS
  881.       sprintf (fname, "chess.lst");
  882. #else
  883.       if (!getstr)
  884.        {
  885.         time (&when);
  886.         strncpy (dbuf, ctime (&when), 20);
  887.         dbuf[7] = '\0';
  888.         dbuf[10] = '\0';
  889.         dbuf[13] = '\0';
  890.         dbuf[16] = '\0';
  891.         dbuf[19] = '\0';
  892. /* use format "CLp16.Jan01-020304B" when patchlevel is 16,
  893.    date is Jan 1
  894.    time is 02:03:04
  895.    program played black */
  896.         sprintf (fname, "t:UC%s.%s%s-%s%s%s%c", patchlevel, dbuf + 4, dbuf + 8, dbuf + 11, dbuf + 14, dbuf + 17, ColorStr[computer][0]);
  897.         /* replace space padding with 0 */
  898.         for (i = 0; fname[i] != '\0'; i++)
  899.         if (fname[i] == ' ')
  900.         fname[i] = '0';
  901.        }
  902.       else
  903.        {
  904.         if (!GetFileName(fname))
  905.          {
  906.           return;
  907.          }
  908.        }
  909. #endif /* MSDOS */
  910.     }
  911.   Delay(5L);
  912.   (void)SetTaskPri((struct Task *)myproc,0);
  913.   fd = fopen (fname, "w");
  914.   Delay(5L);
  915.   if (!fd)
  916.     {
  917.      (void)SetTaskPri((struct Task *)myproc,procpri);
  918.      return;
  919.     }
  920.   /*fprintf (fd, "gnuchess game %d\n", u);*/
  921.   fprintf (fd, "%s\n", VERSTRING);
  922.   fprintf (fd, CP[10]);
  923.   fprintf (fd, CP[11]);
  924.   for (i = 1; i <= GameCnt; i++)
  925.     {
  926.       f = GameList[i].gmove >> 8;
  927.       t = (GameList[i].gmove & 0xFF);
  928.       algbr (f, t, GameList[i].flags);
  929.       if(GameList[i].flags & book)
  930.           fprintf (fd, "%5s  %5d    Book%7ld %5d", mvstr[0],
  931.            GameList[i].score, 
  932.            GameList[i].nodes, GameList[i].time);
  933.       else
  934.           fprintf (fd, "%5s  %5d     %2d %7ld %5d", mvstr[0],
  935.            GameList[i].score, GameList[i].depth,
  936.            GameList[i].nodes, GameList[i].time);
  937.       if ((i % 2) == 0)
  938.     {
  939.       fprintf (fd, "\n");
  940. #ifdef DEBUG40
  941.       if (computer == black)
  942.         fprintf (fd, " %d %d %d %d %d %d %d\n",
  943.              GameList[i].d1,
  944.              GameList[i].d2,
  945.              GameList[i].d3,
  946.              GameList[i].d4,
  947.              GameList[i].d5,
  948.              GameList[i].d6,
  949.              GameList[i].d7);
  950.       else
  951.         fprintf (fd, " %d %d %d %d %d %d %d\n",
  952.              GameList[i - 1].d1,
  953.              GameList[i - 1].d2,
  954.              GameList[i - 1].d3,
  955.              GameList[i - 1].d4,
  956.              GameList[i - 1].d5,
  957.              GameList[i - 1].d6,
  958.              GameList[i - 1].d7);
  959. #endif
  960.     }
  961.       else
  962.     fprintf (fd, "         ");
  963.     }
  964.   fprintf (fd, "\n\n");
  965.   if (GameList[GameCnt].flags & draw)
  966.     {
  967.       fprintf (fd, CP[54], DRAW);
  968.     }
  969.   else if (GameList[GameCnt].score == -9999)
  970.     {
  971.       fprintf (fd, "%s\n", ColorStr[player ]);
  972.     }
  973.   else if (GameList[GameCnt].score == 9998)
  974.     {
  975.       fprintf (fd, "%s\n", ColorStr[player ^ 1]);
  976.     }
  977.   fclose (fd);
  978.   (void)SetTaskPri((struct Task *)myproc,procpri);
  979. }
  980.  
  981. void
  982. Undo (void)
  983.  
  984. /*
  985.  * Undo the most recent half-move.
  986.  */
  987.  
  988. {
  989.   INTSIZE f, t;
  990.   f = GameList[GameCnt].gmove >> 8;
  991.   t = GameList[GameCnt].gmove & 0xFF;
  992.   if (board[t] == king && distance (t, f) > 1)
  993.     (void) castle (GameList[GameCnt].color, f, t, 2);
  994.   else
  995.     {
  996.       /* Check for promotion: */
  997.       if (GameList[GameCnt].flags & promote)
  998.     {
  999.       board[t] = pawn;
  1000.     }
  1001.       board[f] = board[t];
  1002.       color[f] = color[t];
  1003.       board[t] = GameList[GameCnt].piece;
  1004.       color[t] = GameList[GameCnt].color;
  1005.       if (color[t] != neutral)
  1006.     Mvboard[t]--;
  1007.       Mvboard[f]--;
  1008.     }
  1009.   if (GameList[GameCnt].flags & epmask)
  1010.     EnPassant (otherside[color[f]], f, t, 2);
  1011.   else
  1012.     InitializeStats ();
  1013.   epsquare = GameList[GameCnt].epssq;
  1014.   if (TCflag && (TCmoves>1))
  1015.     ++TimeControl.moves[color[f]];
  1016.   hashkey = GameList[GameCnt].hashkey;
  1017.   hashbd = GameList[GameCnt].hashbd;
  1018.   GameCnt--;
  1019.   computer = computer ^ 1;
  1020.   opponent = opponent ^ 1;
  1021.   flag.mate = false;
  1022.   Sdepth = 0;
  1023.   player = player ^ 1;
  1024.   ShowSidetoMove ();
  1025.   UpdateDisplay (0, 0, 1, 0);
  1026. /*  if (flag.regularstart)
  1027.     Book = BOOKFAIL;*/
  1028. }
  1029.  
  1030. void
  1031.  TestSpeed (void (*f) ( INTSIZE int side, INTSIZE int ply), unsigned j)
  1032. {
  1033.   char astr[256];
  1034.   INTSIZE i;
  1035.   long cnt, rate, t1, t2;
  1036.  
  1037.   t1 = time (0);
  1038.   Forbid();
  1039.   for (i = 0; i < j; i++)
  1040.     {
  1041.       f (opponent, 2);
  1042.     }
  1043.   Permit();
  1044.   t2 = time (0);
  1045.   cnt = j * (TrPnt[3] - TrPnt[2]);
  1046.   if (t2 - t1)
  1047.     et = (t2 - t1) * 100;
  1048.   else
  1049.     et = 1;
  1050.   rate = (et) ? (cnt / et) : 0;
  1051.   /*printz ("Nodes= %ld Nodes/sec= %ld\n", cnt, rate);*/
  1052. #ifdef NONDSP
  1053. #ifdef AMIGA
  1054. if (!func_num)
  1055.  sprintf(astr,"Mlst=%dN/s",rate*100);
  1056. else if (func_num == 1)
  1057.  sprintf(astr,"Clst=%dN/s",rate*100);
  1058. ShowMessage(astr);
  1059. #else
  1060.   printz (CP[91], cnt, rate*100);
  1061. #endif
  1062. #ifdef DEBUG9
  1063.   for (j = TrPnt[2]; j < TrPnt[3]; j++)
  1064.     {
  1065.       struct leaf *node = &Tree[j];
  1066.       algbr (node->f, node->t, node->flags);
  1067.       printf ("%s %s %s %s %d %x\n", mvstr[0], mvstr[1], mvstr[2], mvstr[3],node->score,node->flags);
  1068.     }
  1069. #endif
  1070. #else
  1071.   ShowNodeCnt (cnt);
  1072. #endif
  1073. }
  1074.  
  1075. void
  1076.  TestPSpeed (INTSIZE int (*f) (INTSIZE int side), unsigned j)
  1077. {
  1078.   char astr[256];
  1079.   INTSIZE i;
  1080.   long cnt, rate, t1, t2;
  1081.  
  1082.   t1 = time (0);
  1083.   Forbid();
  1084.   for (i = 0; i < j; i++)
  1085.     {
  1086.       (void) f (opponent);
  1087.     }
  1088.   Permit();
  1089.   t2 = time (0);
  1090.   cnt = j;
  1091.   if (t2 - t1)
  1092.     et = (t2 - t1) * 100;
  1093.   else
  1094.     et = 1;
  1095.   rate = (et) ? (cnt / et) : 0;
  1096.   /*printz ("Nodes= %ld Nodes/sec= %ld\n", cnt, rate);*/
  1097. #ifdef NONDSP
  1098. #ifdef AMIGA
  1099. sprintf(astr,"Eval=%ldN/s",rate*100);
  1100. ShowMessage(astr);
  1101. #else
  1102.   printz (CP[91], cnt, rate*100);
  1103. #endif
  1104. #else
  1105.   ShowNodeCnt (cnt);
  1106. #endif
  1107. }
  1108.  
  1109.  
  1110. void
  1111. SetMachineTime (char *s)
  1112. {
  1113.   char *time;
  1114.   int m, t;
  1115.   time = &s[strlen (CP[197])];
  1116.   m = strtol (time, &time, 10);
  1117.   t = strtol (time, &time, 10);
  1118.   if (t)
  1119.     TimeControl.clock[computer] = t;
  1120.   if (m)
  1121.     TimeControl.moves[computer] = m;
  1122. #ifdef XBOARD
  1123.   printz (CP[222], m, t);
  1124. #endif
  1125. }
  1126.  
  1127.  
  1128. void
  1129. InputCommand (cstring)
  1130.  
  1131. char *cstring;
  1132.  
  1133. /*
  1134.  * Process the users command. If easy mode is OFF (the computer is thinking
  1135.  * on opponents time) and the program is out of book, then make the 'hint'
  1136.  * move on the board and call SelectMove() to find a response. The user
  1137.  * terminates the search by entering ^C (quit siqnal) before entering a
  1138.  * command. If the opponent does not make the hint move, then set Sdepth to
  1139.  * zero.
  1140.  */
  1141.  
  1142. {
  1143.   char tstr[40];
  1144.   int i = 0;
  1145.   INTSIZE have_shown_prompt = false;
  1146.   INTSIZE ok, tmp;
  1147.   unsigned INTSIZE mv;
  1148.   char s[80], sx[80];
  1149.  
  1150. #if defined CHESSTOOL
  1151.   INTSIZE normal = false;
  1152.  
  1153. #endif
  1154.  
  1155.   ok = flag.quit = false;
  1156.   player = opponent;
  1157.   ft = 0;
  1158. #ifdef CACHE
  1159.   if(TTadd > ttblsize)ZeroTTable();
  1160. #endif
  1161.   if (hint > 0 && !flag.easy && !flag.force)
  1162.     if ((board[hint >> 8] != pawn) || ((row (hint & 0x3f) != 0) && (row (hint & 0x3f) != 7)))
  1163.       {
  1164.         thinkahead = 1;
  1165.     fflush (stdout);
  1166.         ft = time0;
  1167.     /*time0 = time ((long *) 0);*/
  1168.     algbr ((INTSIZE) hint >> 8, (INTSIZE) hint & 0x3F, false);
  1169.     strcpy (s, mvstr[0]);
  1170.     tmp = epsquare;
  1171. #ifdef DEBUG12
  1172.     if (1)
  1173.       {
  1174.         FILE *D;
  1175.         int r, c, l;
  1176.         extern unsigned INTSIZE int PrVar[];
  1177.         D = fopen ("/tmp/DEBUGA", "a+");
  1178.         fprintf (D, "score = %d\n", root->score);
  1179.         fprintf (D, "inout move is %s\n", s);
  1180.         for (r = 1; PrVar[r]; r++)
  1181.           {
  1182.         algbr (PrVar[r] >> 8, PrVar[r] & 0xff, (INTSIZE) 0);
  1183.         fprintf (D, " %s", mvstr[0]);
  1184.           }
  1185.         fprintf (D, "\n current board is\n");
  1186.         for (r = 7; r >= 0; r--)
  1187.           {
  1188.         for (c = 0; c <= 7; c++)
  1189.           {
  1190.             l = locn (r, c);
  1191.             if (color[l] == neutral)
  1192.               fprintf (D, " -");
  1193.             else if (color[l] == white)
  1194.               fprintf (D, " %c", qxx[board[l]]);
  1195.             else
  1196.               fprintf (D, " %c", pxx[board[l]]);
  1197.           }
  1198.         fprintf (D, "\n");
  1199.           }
  1200.         fprintf (D, "\n");
  1201.         fclose (D);
  1202.       }
  1203. #endif
  1204. #if !defined CHESSTOOL
  1205. #ifndef AMIGA
  1206.     if (flag.post)
  1207.       GiveHint ();
  1208. #endif
  1209. #endif
  1210.     if (VerifyMove (s, 1, &mv))
  1211.       {
  1212.         Sdepth = 0;
  1213. #ifdef QUIETBACKGROUND
  1214. #ifdef NONDSP
  1215.         PromptForMove ();
  1216. #else
  1217.         ShowSidetoMove ();
  1218.         ShowPrompt ();
  1219. #endif
  1220.         have_shown_prompt = true;
  1221. #endif /* QUIETBACKGROUND */
  1222.         SelectMove (computer, 2);
  1223.         VerifyMove (s, 2, &mv);
  1224.         Sdepth = 0;
  1225.       }
  1226.     /*ft = (time ((long *) 0) - time0) * 100;*/
  1227.     epsquare = tmp;
  1228.     time0 = ft;
  1229.       }
  1230.   while (!(ok || flag.quit))
  1231.     {
  1232. #if defined CHESSTOOL
  1233.       normal = false;
  1234. #endif
  1235.       player = opponent;
  1236. #ifdef QUIETBACKGROUND
  1237.       if (!have_shown_prompt)
  1238.     {
  1239. #endif /* QUIETBACKGROUND */
  1240. #ifdef NONDSP
  1241.       PromptForMove ();
  1242. #else
  1243.       ShowSidetoMove ();
  1244.       ShowPrompt ();
  1245. #endif
  1246. #ifdef QUIETBACKGROUND
  1247.     }
  1248.       have_shown_prompt = false;
  1249. #endif /* QUIETBACKGROUND */
  1250. #ifdef NONDSP
  1251.       s[0] = sx[0] = '\0';
  1252. #ifndef AMIGA
  1253.       while (!sx[0])
  1254.     i = (int) gets (sx);
  1255. #else
  1256.        thinking2 = 0;
  1257.        i = 1;
  1258.        thinkahead = 0;
  1259.        GetOperatorEntry(sx);
  1260. #endif
  1261. #else
  1262.       fflush (stdout);
  1263.       i = (int) getstr (sx);
  1264. #endif
  1265.       sscanf (sx, "%s", s);
  1266.       if (i == EOF)
  1267.     ExitChess ();
  1268.       if (s[0] == '\0')
  1269.     continue;
  1270.       if (strcmp (s, CP[131]) == 0)    /*bd*/
  1271.     {
  1272. #if defined CHESSTOOL || defined XBOARD
  1273.       chesstool = 0;
  1274. #endif /* CHESSTOOL */
  1275.       ClrScreen ();
  1276.       UpdateDisplay (0, 0, 1, 0);
  1277. #if defined CHESSTOOL || defined XBOARD
  1278.       chesstool = 1;
  1279. #endif /* CHESSTOOL */
  1280.     }
  1281.       else if (strcmp (s, CP[129]) == 0) /* noop */ ;    /*alg*/
  1282.       else if ((strcmp (s, CP[180]) == 0) || (strcmp (s, CP[216]) == 0))    /* quit exit*/
  1283.     flag.quit = true;
  1284.       else if (strcmp (s, CP[178]) == 0)    /*post*/
  1285.     {
  1286.      /* flag.post = !flag.post;*/
  1287.     }
  1288.       else if ((strcmp (s, CP[191]) == 0) || (strcmp (s, CP[154]) == 0))    /*set edit*/
  1289.     EditBoard ();
  1290. #ifdef NONDSP
  1291.       else if (strcmp (s, CP[190]) == 0)    /*setup*/
  1292.     SetupBoard ();
  1293. #endif
  1294.       else if (strcmp (s, CP[156]) == 0)    /*first*/
  1295.     {
  1296. #if defined CHESSTOOL
  1297.       computer = white;
  1298.       opponent = black;
  1299.       flag.force = false;
  1300.       Sdepth = 0;
  1301. #endif /* CHESSTOOL */
  1302.       ok = true;
  1303.     }
  1304.       else if (strcmp (s, CP[162]) == 0)    /*go*/
  1305.     {
  1306.       ok = true;
  1307.       flag.force = false;
  1308.       if (computer == white)
  1309.         {
  1310.           computer = black;
  1311.           opponent = white;
  1312.         }
  1313.       else
  1314.         {
  1315.           computer = white;
  1316.           opponent = black;
  1317.         }
  1318.     }
  1319.       else if (strcmp (s, CP[166]) == 0)    /*help*/
  1320.     help ();
  1321.       else if (strcmp (s, CP[221]) == 0)    /*material*/
  1322.     flag.material = !flag.material;
  1323.       else if (strcmp (s, CP[157]) == 0)    /*force*/
  1324.     {flag.force = !flag.force; flag.bothsides = false;}
  1325.       else if (strcmp (s, CP[134]) == 0)    /*book*/
  1326.     Book = Book ? 0 : BOOKFAIL;
  1327.       else if (strcmp (s, CP[172]) == 0)    /*new*/
  1328.     {
  1329.       NewGame ();
  1330.       UpdateDisplay (0, 0, 1, 0);
  1331.     }
  1332.       else if (strcmp (s, CP[171]) == 0)    /*list*/
  1333.     ListGame (0xff);
  1334.       else if (strcmp (s, CP[169]) == 0 || strcmp (s, CP[217]) == 0)    /*level clock*/
  1335.        {
  1336.         GetTimeString(tstr);
  1337.     SelectLevel (tstr);
  1338.        }
  1339.       else if (strcmp (s, CP[165]) == 0)    /*hash*/
  1340.     flag.hash = !flag.hash;
  1341.       else if (strcmp (s, CP[132]) == 0)    /*beep*/
  1342.     flag.beep = !flag.beep;
  1343.       else if (strcmp (s, CP[197]) == 0)    /*time*/
  1344.     {
  1345.       SetMachineTime (sx);
  1346.     }
  1347.       else if (strcmp (s, CP[33]) == 0)    /*Awindow*/
  1348.     ChangeAlphaWindow ();
  1349.       else if (strcmp (s, CP[39]) == 0)    /*Bwindow*/
  1350.     ChangeBetaWindow ();
  1351.       else if (strcmp (s, CP[183]) == 0)    /*rcptr*/
  1352.     flag.rcptr = !flag.rcptr;
  1353.       else if (strcmp (s, CP[168]) == 0)    /*hint*/
  1354.        {
  1355.     GiveHint ();
  1356.        }
  1357.       else if (strcmp (s, CP[135]) == 0)    /*both*/
  1358.     {
  1359.       flag.bothsides = !flag.bothsides;
  1360.           if (flag.bothsides)
  1361.            {
  1362.             (void)SetTaskPri((struct Task *)myproc,0);
  1363.             thinkahead = 1;
  1364.            }
  1365.           flag.force = false;
  1366.       Sdepth = 0;
  1367.       ElapsedTime (1);
  1368.       SelectMove (opponent, 1);
  1369.       ok = true;
  1370.     }
  1371.       else if (strcmp (s, CP[185]) == 0)    /*reverse*/
  1372.     {
  1373. #ifndef AMIGA
  1374.       flag.reverse = !flag.reverse;
  1375.       ClrScreen ();
  1376.       UpdateDisplay (0, 0, 1, 0);
  1377. #endif
  1378.     }
  1379.       else if (strcmp (s, CP[195]) == 0)    /*switch*/
  1380.     {
  1381.       computer = computer ^ 1;
  1382.       opponent = opponent ^ 1;
  1383.       xwndw = (computer == white) ? WXWNDW : BXWNDW;
  1384.       flag.force = false;
  1385.       Sdepth = 0;
  1386.       ok = true;
  1387.     }
  1388.       else if (strcmp (s, CP[203]) == 0)    /*white*/
  1389.     {
  1390.       computer = black;
  1391.       opponent = white;
  1392.       xwndw = WXWNDW;
  1393.       flag.force = false;
  1394.       Sdepth = 0;
  1395.  
  1396.       /*
  1397.            * ok = true; don't automatically start with white command
  1398.            */
  1399.     }
  1400.       else if (strcmp (s, CP[133]) == 0)    /*black*/
  1401.     {
  1402.       computer = white;
  1403.       opponent = black;
  1404.       xwndw = BXWNDW;
  1405.       flag.force = false;
  1406.       Sdepth = 0;
  1407.  
  1408.       /*
  1409.            * ok = true; don't automatically start with black command
  1410.            */
  1411.     }
  1412.       else if (strcmp (s, CP[201]) == 0 && GameCnt > 0)    /*undo*/
  1413.     {
  1414. #ifndef AMIGA
  1415.       Undo ();
  1416. #endif
  1417.     }
  1418.       else if (strcmp (s, CP[184]) == 0 && GameCnt > 1)    /*remove*/
  1419.     {
  1420. #ifndef AMIGA
  1421.       Undo ();
  1422.       Undo ();
  1423. #endif
  1424.     }
  1425.       else if (strcmp (s, CP[160]) == 0)    /*get*/
  1426.     GetGame ();
  1427.       else if (strcmp (s, CP[207]) == 0)    /*xget*/
  1428.     GetXGame ();
  1429.       else if (strcmp (s, CP[189]) == 0)    /*save*/
  1430.     SaveGame ();
  1431.       else if (strcmp (s, CP[151]) == 0)    /*depth*/
  1432.     ChangeSearchDepth ();
  1433. #ifdef DEBUG
  1434.       else if (strcmp (s, CP[147]) == 0)    /*debuglevel*/
  1435.     ChangeDbLev ();
  1436. #endif /* DEBUG */
  1437.       else if (strcmp (s, CP[164]) == 0)    /*hashdepth*/
  1438.     ChangeHashDepth ();
  1439.       else if (strcmp (s, CP[182]) == 0)    /*random*/
  1440.     dither = DITHER;
  1441.       else if (strcmp (s, CP[152]) == 0)    /*easy*/
  1442.        {
  1443.     /*flag.easy = !flag.easy;*/
  1444.     flag.easy = flag.easy; /* mod this for menu toggle on amiga */
  1445.        }
  1446.       else if (strcmp (s, CP[143]) == 0)    /*contempt*/
  1447.     SetContempt ();
  1448.       else if (strcmp (s, CP[209]) == 0)    /*xwndw*/
  1449.     ChangeXwindow ();
  1450.       else if (strcmp (s, CP[186]) == 0)    /*rv*/
  1451.     {
  1452.       flag.rv = !flag.rv;
  1453.       UpdateDisplay (0, 0, 1, 0);
  1454.     }
  1455.       else if (strcmp (s, CP[145]) == 0)    /*coords*/
  1456.     {
  1457.       flag.coords = !flag.coords;
  1458.       UpdateDisplay (0, 0, 1, 0);
  1459.     }
  1460.       else if (strcmp (s, CP[193]) == 0)    /*stras*/
  1461.     {
  1462.       flag.stars = !flag.stars;
  1463.       UpdateDisplay (0, 0, 1, 0);
  1464.     }
  1465.       else if (strcmp (s, CP[196]) == 0)    /*test*/
  1466.     {
  1467. /*      ShowMessage (CP[108]);/*test movelist*/
  1468.           ShowMessage ("Testing..");
  1469.           func_num = 0;
  1470.       TestSpeed (MoveList, 20000);
  1471. /*      ShowMessage (CP[107]);/*test capturelist*/
  1472.           func_num++;
  1473.       TestSpeed (CaptureList, 30000);
  1474. /*      ShowMessage (CP[85]);/*test score position*/
  1475.           func_num++;
  1476.       TestPSpeed (ScorePosition, 15000);
  1477.     }
  1478.       else
  1479.       if (strcmp (s, CP[179]) == 0)    /*p*/
  1480.     ShowPostnValues ();
  1481.       else if (strcmp (s, CP[148]) == 0)    /*debug*/
  1482.     DoDebug ();
  1483.     else if (strcmp (s, "Mwpawn") == 0)        /*debug*/
  1484.         DoTable (Mwpawn);
  1485.     else if (strcmp (s, "Mbpawn") == 0)        /*debug*/
  1486.         DoTable (Mbpawn);
  1487.     else if (strcmp (s, "Mwknight") == 0)        /*debug*/
  1488.         DoTable (Mknight[white]);
  1489.     else if (strcmp (s, "Mbknight") == 0)        /*debug*/
  1490.         DoTable (Mknight[black]);
  1491.     else if (strcmp (s, "Mwbishop") == 0)        /*debug*/
  1492.         DoTable (Mbishop[white]);
  1493.     else if (strcmp (s, "Mbbishop") == 0)        /*debug*/
  1494.         DoTable (Mbishop[black]);
  1495.       else
  1496.     { /* this is where we move the humans pieces */
  1497. #if defined CHESSTOOL
  1498.       normal = (ok = VerifyMove (s, 0, &mv));
  1499. #else
  1500.       ok = VerifyMove (s, 0, &mv);
  1501. #endif
  1502. #ifdef OLDVERSION1_01
  1503.       if ((ok && mv != hint))
  1504.         {
  1505.           Sdepth = 0;
  1506.           ft = 0;
  1507.         }
  1508.       else
  1509.         Sdepth = 0;
  1510. #else
  1511.       if ((!flag.easy)&&(mv == hint))
  1512.            {
  1513.             ThinkAheadDepth = Sdepth2;
  1514.             if (ThinkInARow > 4) /* if it got to 4, we would have skipped one */
  1515.              ThinkInARow = 0;
  1516.             ThinkAheadWorked = 1;
  1517.            }
  1518.           else
  1519.            {
  1520.             ThinkInARow = 0;
  1521.             ThinkAheadDepth = 0;
  1522.             ThinkAheadWorked = 0;
  1523.            }
  1524.       Sdepth = 0;
  1525. #endif
  1526.           if ((!ok))
  1527.            {
  1528.             IllegalMove = 1;
  1529.            }
  1530.           if ((ok)&&(MouseDropped))
  1531.            {
  1532.                 DoLegalMove(s);
  1533.                 MouseDropped = 0;
  1534.            }
  1535.     }
  1536.     }
  1537.  
  1538.   ElapsedTime (1);
  1539.   if (flag.force)
  1540.     {
  1541.       computer = opponent;
  1542.       opponent = computer ^ 1;
  1543.     }
  1544. #if defined CHESSTOOL || defined XBOARD
  1545. #if defined CHESSTOOL
  1546.   if (normal)
  1547.     if (computer == white)
  1548.       printz ("%d. %s", ++mycnt2, s);
  1549.     else
  1550.       printz ("%d. ... %s", ++mycnt2, s);
  1551. #else
  1552.   printz ("%d. %s\n", ++mycnt2, s);
  1553. #endif
  1554. #ifdef notdef
  1555.   if (flag.post)
  1556.     {
  1557.       REG int i;
  1558.  
  1559.       printz (" %6d ", MSCORE);
  1560.       for (i = 1; MV[i] > 0; i++)
  1561.     {
  1562.       algbr ((INTSIZE) (MV[i] >> 8), (INTSIZE) (MV[i] & 0xFF), false);
  1563.       printz ("%5s ", mvstr[0]);
  1564.     }
  1565.     }
  1566.   printz ("\n");
  1567. #endif
  1568. #endif /* CHESSTOOL */
  1569.   signal (SIGINT, TerminateSearch);
  1570. #ifndef MSDOS
  1571.   signal (SIGQUIT, TerminateSearch);
  1572. #endif /* MSDOS */
  1573. }
  1574.  
  1575.  
  1576. void
  1577. ElapsedTime (INTSIZE int iop)
  1578.  
  1579.  
  1580. /*
  1581.  * Determine the time that has passed since the search was started. If the
  1582.  * elapsed time exceeds the target (ResponseTime+ExtraTime) then set timeout
  1583.  * to true which will terminate the search. iop = 0 calculate et bump ETnodes
  1584.  * iop = 1 calculate et set timeout if time exceeded, calculate et
  1585.  */
  1586.  
  1587. {
  1588. #ifndef MSDOS
  1589.   extern int errno;
  1590. #ifdef AMIGA
  1591.    struct IntuiMessage *localmessage;
  1592.    long __aligned class,code;
  1593. #endif
  1594. #ifdef FIONREAD
  1595.   if (i = ioctl ((int) 0, FIONREAD, &nchar))
  1596.     {
  1597.       perror ("FIONREAD");
  1598.       fprintf (stderr,
  1599.         "You probably have a non-ANSI <ioctl.h>; see README. %d %d %x\n",
  1600.     i, errno, FIONREAD);
  1601.       exit (1);
  1602.     }
  1603.  
  1604.   if (nchar)
  1605.     {
  1606.       if (!flag.timeout)
  1607.     flag.back = true;
  1608.       flag.bothsides = false;
  1609.     }
  1610. #endif /*FIONREAD*/
  1611. #ifdef AMIGA /* check if I need to interrupt thinking */
  1612.   if (thinkahead)
  1613.   {
  1614.   while ( (localmessage = (struct IntuiMessage *)
  1615.     GetMsg(wG->UserPort) )) /* got a message at window port */
  1616.    {
  1617.         if (localmessage->Class == RAWKEY)
  1618.          {
  1619.           if (localmessage->Code < 56)
  1620.            code = cookedchar[localmessage->Code];
  1621.           else
  1622.            code = 0;
  1623.          }
  1624.         else
  1625.          {
  1626.           code = 'A';
  1627.          }
  1628.         if (isalpha(code))
  1629.          {
  1630.           (void)SetTaskPri((struct Task *)myproc,procpri);
  1631.           if (!flag.timeout)
  1632.            {
  1633.             flag.back = true;
  1634.            }
  1635.           flag.bothsides = false;
  1636.       globalmessage_valid = 0xffff;
  1637.           globalmessage = *localmessage;
  1638.          }
  1639.     ReplyMsg((struct Message *)localmessage);
  1640.    }
  1641.   }
  1642.   else if (thinking2) /* check for move now menu item */
  1643.   {
  1644.   while ( (localmessage = (struct IntuiMessage *)
  1645.     GetMsg(wG->UserPort) )) /* got a message at window port */
  1646.    {
  1647.     class = localmessage->Class;
  1648.         code = localmessage->Code;
  1649.     ReplyMsg((struct Message *)localmessage);
  1650.         if ((class == MENUPICK))
  1651.           {
  1652.         if (ItemAddress(&Menu1,code) == &MenuItem6)
  1653.             {
  1654.              if (!flag.timeout)
  1655.               {
  1656.                flag.back = true;
  1657.               flag.musttimeout = true;
  1658.               }
  1659.              flag.bothsides = false;
  1660.             }
  1661.           }
  1662.    }
  1663.   }
  1664. #endif
  1665. #else
  1666.   if (kbhit ())
  1667.     {
  1668.       if (!flag.timeout)
  1669.     flag.back = true;
  1670.       flag.bothsides = false;
  1671.     }
  1672. #endif /* MSDOS */
  1673.   et = (time ((long *) 0) - time0) * 100;
  1674.   ETnodes = NodeCnt + ZNODES;
  1675.   if (et < 0)
  1676.     et = 0;
  1677.   if (iop == 1)
  1678.     {
  1679.       if (et > ResponseTime + ExtraTime && Sdepth > MINDEPTH)
  1680.     flag.timeout = true;
  1681.       ETnodes = NodeCnt + ZNODES;
  1682.       time0 = time ((long *) 0);
  1683.     }
  1684. #ifdef AMIGA
  1685.     UpdateClocks ();
  1686. #endif
  1687. }
  1688.  
  1689.  
  1690. void
  1691. SetTimeControl (void)
  1692. {
  1693.  int tmp;
  1694.   if (TCflag)
  1695.     {
  1696.       TimeControl.moves[white] = TimeControl.moves[black] = TCmoves;
  1697.       TimeControl.clock[white] = 6000L * TCminutes + TCseconds * 100;
  1698.       TimeControl.clock[black] = 6000L * TCminutes + TCseconds * 100;
  1699.       tmp = (TCminutes*60+TCseconds)/TCmoves;
  1700.       if (tmp < 10)
  1701.        {
  1702.         GlobalTgtDepth = 2;
  1703.        }
  1704.       else if (tmp < 180)
  1705.        {
  1706.         GlobalTgtDepth = 3;
  1707.        }
  1708.       else
  1709.        GlobalTgtDepth = 4;
  1710.     }
  1711.   else
  1712.     {
  1713.       TimeControl.moves[white] = TimeControl.moves[black] = 0;
  1714.       TimeControl.clock[white] = TimeControl.clock[black] = 0;
  1715.     }
  1716.   flag.onemove = (TCmoves == 1);
  1717.   et = 0;
  1718.   ElapsedTime (1);
  1719. }
  1720.